import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder
import seaborn as sns
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.model_selection import train_test_split, RandomizedSearchCV
from xgboost import XGBClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.metrics import roc_auc_score, roc_curve,auc
from sklearn.metrics import accuracy_score, f1_score, confusion_matrix, classification_report
import lightgbm as lgb
from sklearn.linear_model import LogisticRegression
from imblearn.over_sampling import SMOTE
from collections import Counter
import re
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.models import load_model
from keras.models import Model
from keras.optimizers import Adam
from tensorflow.keras.utils import to_categorical
#设置中文编码和负号的正常显示
plt.rcParams['font.family']='Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False

def process_grade(text):
    return re.sub('[{}]'.format(stopwords_list),"",text)

# sns.set()
# sns.set_context('notebook', font_scale= 1.2)

pd.set_option('display.max_rows', 50)
pd.set_option('display.max_columns', 50)

# 受贿
data_sh = pd.read_excel('受贿终.xlsx')
data_sh['案件'] = 0

# 贪污
data_tw = pd.read_excel('贪污终.xlsx')
data_tw['案件'] = 1
df = pd.concat([data_sh, data_tw], axis=0).reset_index()

del df['index']

"""对性别进行处理 按照名字定性别标签+剔除0"""

print(df['性别'].value_counts())
# 女性名字常用
f_name = '妍 念 倩 幂 辰 慕 理 霜 依 喻 微 紫 盼 语 音 杏 晓 葵 媛 采 乐 青 月 松 彩 碧 蓉 滢 含 馥 素 沐 白 南 容 知 艳 梨 琦 盈 筠 音 茹 静 尔 沛 娅 玉 宸 畅 韵 丹 尚 钰 桐 美 梦 璐 荷 悦 菡 曦 聪 希 黛 虞 歆 可 爽 雅 初 昕 缦 洁 迪 凌 靖 芝 忆 熙 芊 奕 帆 露 灵 霄 颖 笛 迎'
# 男性名字常用
m_name = '伟、刚、勇、毅、俊、峰、强、军、平、保、东、文、辉、力、明、永、健、世、广、志、义、兴、良、海、山、仁、波、宁、贵、福、生、龙、元、全、国、胜、学、祥、才、发、武、新、利、清、飞、彬、富、顺、信、子、杰、涛、昌、成、康、星、光、天、达、安、岩、中、茂、进、林、有、坚、和、彪、博、诚、先、敬、震、振、壮、会、思、群、豪、心、邦、承、乐、绍、功、松、善、厚、庆、磊、民、友、裕、河、哲、江、超、浩、亮、政、谦、亨、奇、固、之、轮、翰、朗、伯、宏、言、若、鸣、朋、斌、梁、栋、维、启、克、伦、翔、旭、鹏、泽、晨、辰、士、以、建、家、致、树、炎、德、行、时、泰、盛'

df['性别'] = df['性别'].astype(str)
for i in range(len(df['当事人'])):
    if df['性别'][i] == '0':
        s = list(df['当事人'][i][1:])
        if len(set(s).intersection(f_name.split(' '))) > 0:
            df['性别'][i] = '女'
for i in range(len(df['当事人'])):
    if df['性别'][i] == '0':
        s = list(df['当事人'][i][1:])
        if len(set(s).intersection(m_name.split('、'))) > 0:
            df['性别'][i] = '男'

gender = np.unique(df['性别']) #['0' '女' '男']
print(gender)
df = df.drop(df[df['性别']=='0'].index)

"""对时间进行处理"""
for index,component in enumerate(['年', '月', '日']):
    df['%s_%s' % ('裁决日期',component)] = df['裁决日期'].apply(lambda x: int(x.split(' ')[0].split('-')[index]))


"""对级别进行处理，①去除其标点符号②对于长度大于6的进行取后两个字符（因为大部分职位基本为后两字代表）"""
stopwords_list = '＂＃＄％＆＇（）＊＋，－／：；＜＝＞＠［＼］＾＿｀｛｜｝～｟｠｢｣､\u3000、〃〈〉《》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛“”„‟…‧﹏﹑﹔·！？｡。'

df['级别'] = df['级别'].astype(str).apply(process_grade)
df['级别'] = df['级别'].apply(lambda x : x[-2:] if len(x) > 6 else x)
df['级别'] = df['级别'].apply(lambda x : np.nan if x == 'nan' else x)

# 数据探索
df = df.fillna(0)
df.columns
# 描述统计
l = df.describe()
# 男女可视化
df.性别.value_counts()/df.性别.value_counts().sum()
# 学历统计
df.学历.value_counts()/df.学历.value_counts().sum()
# 案件统计
df.案件.value_counts()/df.案件.value_counts().sum()
df.徒刑.value_counts()/df.徒刑.value_counts().sum()
df.数额.mean()
df.量刑情节.value_counts()/df.量刑情节.value_counts().sum()
df.级别.value_counts()/df.级别.value_counts().sum()
# 平均年龄
# 平均犯罪数额
# 男性数量占比
# 女性数量占比
# 学历
#    研究生学历占比
#    大学本科/大专占比
#    高中/中专占比
#    初中占比
#    小学占比
#    文盲占比
#    其他占比
# 徒刑
#    有期徒刑占比
#    拘役占比
#    无期徒刑占比
#    其他占比
# 男女差异分析
import statsmodels.api as sm
tstat, pvalue, dc = sm.stats.ttest_ind(df.loc[df['性别']=='男']['案件'],df.loc[df['性别']=='女']['案件'])
print('t统计量为: %.3f;p值为: %.4f;自由度为：%.1f;' % (tstat, pvalue,dc))
# t统计量为: -8.149;p值为: 0.0000;自由度为：8790.0;
# 说明：该例使用t检验，判断受贿和贪污的性别是否有区别，结论是p<0.05,两组数据之间一定差异
